"use strict";
// 字符串
var myName = 'coderzrf';
// 数值
var age = 23;
// 布尔
var isBoy = true;
// 数组
var hobbies = [];
hobbies.push('basketball', 1024);
var hobbies2 = [];
hobbies2.push('football', 2048);
// 元组 
// 与数组的区别在于元素在数组位置的类型是固定的
var tuple = ['handsome', true];
//对象
// 1.不限制值类型
var user;
user = [];
user = new Object();
user = Object.prototype;
user = { name: 'coderzrf' };
// 2.限制值类型
var user2; //属性后面跟上? 用来指定 url 为可选值，这样的属性是非必填项
user2 = {
    name: 'coderzrf',
    age: 22,
};
// any
// 使用 any 指包含所有值的顶部类型，所以any不进行类型检查，等于关闭了 TS 对该变量的严格类型校验
var array; //let array: any
var user3;
// unknown
/*
* unknown 用于表示未知的类型
* 与 any 的区别是 any 不进行 TS 校验，unknown 类型要安全得多，会进行 TS 的类型检查
* 使用 unknown 类型时一般需要 as 类型断言来转换类型
*/
var info1 = 'info1';
var info2 = 'info2';
var a = info1;
// let b: string = info2 报错: 'unknown'未知类型不能赋值给'string'类型
// 借助as断言
var b = info2;
// 借助unknown做个中间层转换
var nn = '1024';
var parsedNn = nn;
// void 
// void类型的值为null或undefined,常用于对函数返回值类型
// 严格模式下只能是 undefined
function foo() {
    return;
}
// nerver
// never 是永远不会结束的函数，所以也不会有返回值
function foo2() {
    throw new Error("出错了");
}
// null & undefined
// 当配置项启用 strictNullChecks 时，null 与 undefined 只能赋值给 void、null、undefined 类型
var myNull = null;
var myUndefined = undefined;
// 函数
var func2;
func2 = function () { return 'isFunction'; };
// 函数参数及返回值
function sum(a, b, ratio) {
    return a + b;
}
var sum2 = function (a, b, ratio) { return a + b; };
// 剩余参数
var sumAll = function () {
    var args = [];
    for (var _i = 0; _i < arguments.length; _i++) {
        args[_i] = arguments[_i];
    }
    return args.reduce(function (s, n) { return s + n; }, 0);
};
// 函数定义
var func3;
var addUser = function (u) {
    console.log("添加了用户");
    return true;
};
